<?php

namespace App\Adapters\Annotations;

use \Phalcon\Annotations\Adapter;
use \Phalcon\Annotations\Reflection;

/**
 * Apcu 注释适配器
 * 已解析和已处理的注释将永久保存在APCU缓存中提升性能
 * @package App\Adapters\Annotations
 *
 */
class ApcuAdapter extends Adapter {

    #region 属性

    protected $_prefix = "";

    protected $_ttl = 30;

    #endregion

    #region 构造函数

    /**
     * 构造函数
     * @param array $options
     */
    public function __construct($options = null) {
        if (is_array($options)) {
            if (isset($options["prefix"])) {
                $this->_prefix = $options["prefix"];
            }
            if (isset($options["lifetime"])) {
                $this->_ttl = $options["lifetime"];
            }
        }
    }

    #endregion

    #region 读取、写入解析注解

    /**
     * 从APCU读取解析注解
     *
     * @param string $key 关键字
     * @return \Phalcon\Annotations\Reflection
     */
    public function read($key) {
        return apcu_fetch ($this->_generateKey($key));
    }

    /**
     * 将解析的注释写入APCU中
     *
     * @param string $key 关键字
     * @param mixed $data 写入的数据
     * @return bool|array
     */
    public function write($key, Reflection $data) {
        return apcu_store($this->_generateKey($key), $data, $this->_ttl);
    }

    #endregion

    #region 生成缓存Key

    /**
     * 生成缓存Key
     * @param $key
     * @return string
     */
    private function _generateKey($key) {
        return strtolower("_PHAN{$this->_prefix}{$key}");
    }

    #endregion
}